package org.lql.algo.codecrush.week006;

import java.util.HashSet;
import java.util.Set;

/**
 * @author: liangqinglong
 * @date: 2025-08-07 17:46
 * @description: 1502. 判断能否形成等差数列 <a href="https://leetcode.cn/problems/can-make-arithmetic-progression-from-sequence/description/">...</a>
 **/
public class CanMakeArithmeticProgression {

	/**
	 * 给你一个数字数组 arr 。
	 * <p>
	 * 如果一个数列中，任意相邻两项的差总等于同一个常数，那么这个数列就称为 等差数列 。
	 * <p>
	 * 如果可以重新排列数组形成等差数列，请返回 true ；否则，返回 false 。
	 * <p>
	 * <p>
	 * <p>
	 * 示例 1：
	 * <p>
	 * 输入：arr = [3,5,1]
	 * 输出：true
	 * 解释：对数组重新排序得到 [1,3,5] 或者 [5,3,1] ，任意相邻两项的差分别为 2 或 -2 ，可以形成等差数列。
	 * 示例 2：
	 * <p>
	 * 输入：arr = [1,2,4]
	 * 输出：false
	 * 解释：无法通过重新排序得到等差数列。
	 * <p>
	 * <p>
	 * 提示：
	 * <p>
	 * 2 <= arr.length <= 1000
	 * -10^6 <= arr[i] <= 10^6
	 */
	public boolean canMakeArithmeticProgression(int[] arr) {
		int n = arr.length;
		int min = Integer.MAX_VALUE;
		int max = Integer.MIN_VALUE;
		Set<Integer> set = new HashSet<>();

		// 找 min 和 max，同时存入 set
		for (int num : arr) {
			min = Math.min(min, num);
			max = Math.max(max, num);
			set.add(num);
		}

		// 公差必须是整数
		if ((max - min) % (n - 1) != 0) {
			return false;
		}

		int diff = (max - min) / (n - 1);
		if (diff == 0) {
			return set.size() == 1; // 所有数都相同
		}

		// 检查等差数列是否都在集合中
		int curr = min;
		for (int i = 0; i < n; i++) {
			if (!set.contains(curr)) {
				return false;
			}
			curr += diff;
		}
		return true;
	}

	public static void main(String[] args) {
		CanMakeArithmeticProgression canMakeArithmeticProgression = new CanMakeArithmeticProgression();
		System.out.println(canMakeArithmeticProgression.canMakeArithmeticProgression(new int[]{3, 5, 1}));
	}
}
